import type { Linter } from 'eslint'

import {
    command,
    comments,
    disableds,
    ignores,
    importPluginConfig,
    javascript,
    jsdoc,
    jsonc,
    node,
    perfectionist,
    prettier,
    regexp,
    test,
    turbo,
    typescript,
    unicorn,
    vue
} from './configs'
import { customConfig } from './custom-config'

type FlatConfig = Linter.Config

type FlatConfigPromise = FlatConfig | FlatConfig[] | Promise<FlatConfig> | Promise<FlatConfig[]>

async function defineConfig(config: FlatConfig[] = []) {
    const configs: FlatConfigPromise[] = [
        vue(),
        javascript(),
        ignores(),
        prettier(),
        typescript(),
        jsonc(),
        disableds(),
        importPluginConfig(),
        node(),
        perfectionist(),
        comments(),
        jsdoc(),
        unicorn(),
        test(),
        regexp(),
        command(),
        turbo(),
        ...customConfig,
        ...config
    ]

    const resolved = await Promise.all(configs)

    return resolved.flat()
}

export { defineConfig }
